"""
@Author: li
@Email: lijianqiao2906@live.com
@FileName: auth_resolver.py
@DateTime: 2025-06-18
@Docs: 网络设备认证信息解析器，统一处理动态密码和固定密码逻辑
"""

from typing import NamedTuple

from app.models.data_models import Device


class DeviceCredentials(NamedTuple):
    """设备认证信息"""

    username: str
    password: str
    source: str  # "database" | "user_input" | "mixed"


class NetworkAuthResolver:
    """网络设备认证信息解析器

    统一处理账号密码的动态选择逻辑：
    - 如未提供用户名，则使用数据库中的账号
    - 如提供了用户名，则使用该用户名
    - 如未提供密码，则使用数据库密码
    - 如提供了密码，则使用该密码

    这样支持95%动态密码+5%固定密码的安全策略
    """

    @staticmethod
    def resolve_credentials(
        device: Device, username: str | None = None, password: str | None = None
    ) -> DeviceCredentials:
        """解析设备认证信息

        Args:
            device: 设备对象（包含数据库中的账号密码）
            username: 用户提供的用户名（可选）
            password: 用户提供的密码（可选）

        Returns:
            DeviceCredentials: 解析后的认证信息
        """
        # 解析用户名
        final_username = username if username is not None else (device.account or "admin")

        # 解析密码
        final_password = password if password is not None else (device.password or "admin")

        # 确定来源
        if username is None and password is None:
            source = "database"
        elif username is not None and password is not None:
            source = "user_input"
        else:
            source = "mixed"

        return DeviceCredentials(username=final_username, password=final_password, source=source)

    @staticmethod
    def validate_credentials(credentials: DeviceCredentials) -> bool:
        """验证认证信息是否完整

        Args:
            credentials: 认证信息

        Returns:
            bool: 是否有效
        """
        return bool(credentials.username and credentials.password)
